#include "../../include/server/ProtocolParser.h"
extern WebPageQuery webPageQuery;

ProtocolParser::ProtocolParser(const string &msg)
    : _msg(msg)
{
}

string ProtocolParser::doParse()
{
    auto msgJson = json::parse(_msg);
    string message = msgJson["message"];
    string messageId = msgJson["messageId"];

    // 如果不是英文字符串，但是包含英文字符串，则为中英文混合
    if (!isEnglish(message) && !notIncludeEnglish(message))
    {
        string jsonMsg = jsonMsgPack("50", "输入错误，请输入中文或英文");
        LogError("用户错误信息: %s", jsonMsg.c_str());
        return jsonMsg;
    }
    else if (isEnglish(message))
    {
        if (messageId == "1")
        {
            Recommander *rec = new EnRecommander();
            string jsonMsg = rec->recommander(message);
            LogInfo("用户查询关键字: %s", message.c_str());
            return jsonMsgPack("100", jsonMsg);
        }
        else if (messageId == "2")
        {
            string jsonMsg = jsonMsgPack("50", "输入错误，请输入中文");
            LogError("用户错误信息: %s", jsonMsg.c_str());
            return jsonMsg;
        }
    }
    else
    {
        // 如果不是英文字符串，且不包含英文字符则为中文字符
        if (messageId == "1")
        {
            Recommander *chrec = new Chcommander();
            string jsonMsg = chrec->recommander(message);
            LogInfo("用户查询关键字: %s", message.c_str());
            return jsonMsgPack("100", jsonMsg);
        }
        else if (messageId == "2")
        {
            string jsonMsg = webPageQuery.doQuery(message);
            LogInfo("用户查询网页: %s", message.c_str());
            // cout << jsonMsg << endl;
            return jsonMsgPack("200", jsonMsg);
        }
    }
}

string ProtocolParser::jsonMsgPack(const string &msgId, const string &msg)
{
    json msgJson;
    msgJson["messageId"] = msgId;
    msgJson["message"] = msg;
    return msgJson.dump();
}

// 如果字符只有英文字符和空格，则算作是英文字符
bool ProtocolParser::isEnglish(const string &msg)
{
    for (int i = 0; i < msg.size(); i++)
    {
        if (!isalpha(msg[i]) && msg[i] != ' ')
        {
            return false;
        }
    }
    return true;
}

// 如果字符没有英文字符则不包含英文字符串
bool ProtocolParser::notIncludeEnglish(const string &msg)
{
    for (int i = 0; i < msg.size(); i++)
    {
        if (isalpha(msg[i]))
        {
            return false;
        }
    }
    return true;
}
